using Godot;
using GodotPlugins.Game;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Reflection;

public partial class PlayerController : Area2D
{
    // 玩家移动的速度（像素_秒）。
    [Export]
    public int Speed { get; set; } = 400;

    // 游戏窗口的大小。
    public Vector2 ScreenSize;

    // 自定义信号
    [Signal]
    public delegate void HitEventHandler();

    // 当节点第一次进入场景树时调用。
    public override void _Ready()
    {
        ScreenSize = GetViewportRect().Size;

    //    Hide();
    }

    // 调用每一帧。_delta_是自上一帧以来经过的时间。
    public override void _Process(double delta)
    {
        // 玩家的运动矢量。
        Vector2 velocity = Vector2.Zero;

        // 键盘按下事件
        if (Input.IsActionPressed("move_up"))
        {
            velocity.Y -= 1;
        }
        if (Input.IsActionPressed("move_down"))
        {
            velocity.Y += 1;
        }
        if (Input.IsActionPressed("move_left"))
        {
            velocity.X -= 1;
        }
        if (Input.IsActionPressed("move_right"))
        {
            velocity.X += 1;
        }

        AnimatedSprite2D animatedSprite2D = this.GetNode<AnimatedSprite2D>("AnimatedSprite2D");

        if (velocity.Length() > 0)
        {
            velocity = velocity.Normalized() * Speed;
            animatedSprite2D.Play();
        }
        else
        {
            animatedSprite2D.Stop();
        }

        // 角色不能超出屏幕范围，Clamp：限制一个值，使其不小于最小值且不大于最大值。
        this.Position += velocity * (float)delta;
        this.Position = new Vector2(
            x: Mathf.Clamp(Position.X, 0, ScreenSize.X),
            y: Mathf.Clamp(Position.Y, 0, ScreenSize.Y)
        );

        // 控制角色动画
        if (velocity.X != 0)
        {
            animatedSprite2D.Animation = "walk";
            animatedSprite2D.FlipV = false;
            animatedSprite2D.FlipH = velocity.X < 0;
        }
        else if (velocity.Y != 0)
        {
            animatedSprite2D.Animation = "up";
            animatedSprite2D.FlipV = velocity.Y > 0;
        }
    }

    // 角色与敌人发生碰撞
    private void OnBodyEntered(Node2D node2D)
    {
        // 玩家被击中后消失
        Hide();
        EmitSignal(SignalName.Hit);
        // 禁用碰撞
        this.GetNode<CollisionShape2D>("CollisionShape2D").SetDeferred(CollisionShape2D.PropertyName.Disabled, true);
    }

    // 玩家复活
    private void Start(Vector2 position)
    {
        this.Position = position;
        Show();
        this.GetNode<CollisionShape2D>("CollisionShape2D").Disabled = false;
    }

}
